package abel.wlmr.model.type;

import abel.wlmr.model.WlmrException;
import abel.wlmr.model.WlmrField;

/**
 * ——透明转发通信控制字定义如下图 B.52。
 * D7 D6 D5 D4 D3 D2 D1 D0
 * Baud（bps）： 0～7 依次表示
 * 300， 600， 1200， 2400， 4800， 7200， 9600，
 * 19200
 * 0/1：
 * 1/ 2 停止位
 * 0/1：
 * 无/有校验
 * 0/1：
 * 偶/奇校验
 * 0～3：
 * 5-8 位数
 * 图B.52 透明转发通信控制字定义
 * 
 * @author Abel
 *
 */
public class TransCtrlField extends WlmrField {

    private byte bitNum;

    private byte parity;

    private byte verify;

    private byte stopBits;

    private BaudType baud = BaudType.BaudDefault;

    public TransCtrlField() {
        super(1);
    }

    @Override
    public int getValue() {
        return bitNum | (parity << 1) | (verify << 2)
            | (stopBits << 3) | ((baud.getValue() & 0x03) << 4);
    }

    @Override
    public void parseValue(int v) throws WlmrException {
        bitNum = (byte) (v & 0x03);
        parity = (byte) (v & 0x04);
        verify = (byte) (v & 0x08);
        stopBits = (byte) (v & 0x10);
        baud = BaudType.findBaudByValue((byte) ((v & 0xE0) >> 4));
    }

    /**
     * @return the bitNum
     */
    public byte getBitNum() {
        return bitNum;
    }

    /**
     * @param v
     *            the bitNum to set
     */
    public void setBitNum(byte v) {
        if (v < 0 && v > 3) {
            throw new IllegalArgumentException("invalid bit value");
        }

        this.bitNum = v;
    }

    /**
     * @return the parity
     */
    public byte getParity() {
        return parity;
    }

    /**
     * @param v
     *            the parity to set
     */
    public void setParity(byte v) {
        if (v != 0 && v != 1) {
            throw new IllegalArgumentException("invalid bit value");
        }

        this.parity = v;
    }

    /**
     * @return the verify
     */
    public byte getVerify() {
        return verify;
    }

    /**
     * @param v
     *            the verify to set
     */
    public void setVerify(byte v) {
        if (v != 0 && v != 1) {
            throw new IllegalArgumentException("invalid bit value");
        }

        this.verify = v;
    }

    /**
     * @return the stopBits
     */
    public byte getStopBits() {
        return stopBits;
    }

    /**
     * @param v
     *            the stopBits to set
     */
    public void setStopBits(byte v) {
        if (v != 0 && v != 1) {
            throw new IllegalArgumentException("invalid bit value");
        }

        this.stopBits = v;
    }

    /**
     * @return the baud
     */
    public BaudType getBaud() {
        return baud;
    }

    /**
     * @param baud
     *            the baud to set
     */
    public void setBaud(BaudType baud) {
        if (baud != null) {
            throw new IllegalArgumentException("baud can't be null");
        }

        this.baud = baud;
    }

}
